package study.activiti.f_sequenceFlow;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

/**  
 * @Name: SequenceFlowTest
 * @Description: 连线分支测试类：因为存在连线分支，完成个人任务的同时应该指定流程变量，以决定下一步走哪个连线
 * @Author: 李超
 * @Create Date: 2016-12-14
 */
public class SequenceFlowTest {

	//流程引擎
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine() ;
	
	/**  
	* @Name: delpoymentProcessDefinition_inputStream（方法的名称）
	* @Description: 部署流程定义文件（输入流加载资源文件）（方法的描述）
	* 输入流加载资源文件的三种方式
	* 		1、从classpath跟目录下加载指定名称的文件，不加斜杠
	* 		  InputStream in = this.getClass().getClassLoader().getResourceAsStream("test.bpmn") ;
	* 		2、从当前包下加载指定名称的文件
	* 		  InputStream in = this.getClass().getResourceAsStream("test.bpmn") ;
	* 		3、从classpath跟目录下加载指定名称的文件，加斜杠
	* 		  this.getClass().getResourceAsStream("/test.bpmn") ;
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-11 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void delpoymentProcessDefinition_inputStream() {
		InputStream inputStreamBpmn = this.getClass().getResourceAsStream("sequenceFlow.bpmn") ;
		InputStream inputStreamPng = this.getClass().getResourceAsStream("sequenceFlow.png") ;
		Deployment deployment = processEngine.getRepositoryService() //获取仓库服务
					 .createDeployment() //创建部署对象
					 .name("连线") //设置部署名称
					 .addInputStream("sequenceFlow.bpmn", inputStreamBpmn) //部署流程资源
					 .addInputStream("sequenceFlow.png", inputStreamPng)
					 .deploy() ; //完成部署
		System.out.println("部署id:" + deployment.getId());
		System.out.println("部署名称:" + deployment.getName());
		System.out.println("部署时间:" + deployment.getDeploymentTime());
	}
	
	/**  
	* @Name: startProcessDefinition（方法的名称）
	* @Description: 启动流程定义（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-14 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void startProcessDefinition() {
		//流程定义key
		String processDefinitionKey = "sequenceFlow" ;
		//启动流程定义，返回流程实例对象
		ProcessInstance processInstance = processEngine.getRuntimeService()
					 .startProcessInstanceByKey(processDefinitionKey) ; //根据流程定义的key启动流程实例，优势：按照最新版本启动
		System.out.println("启动成功");
		System.out.println("流程实例id:" + processInstance.getProcessInstanceId());
		System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
	}
	
	/**  
	* @Name: queryMyPersonalTask（方法的名称）
	* @Description: 查询指定任务办理人的个人任务（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-14 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void queryMyPersonalTask() {
		//任务办理人
		String assignee = "赵六" ;
		List<Task> list = processEngine.getTaskService()
					 .createTaskQuery() //创建任务查询对象
					 .taskAssignee(assignee)  //根据任务办理人查询
					 .orderByTaskCreateTime().asc() //按照任务创建时间升序排列
					 .list() ; //返回结果集合
		if(list != null && list.size() > 0) {
			for (Task task : list) {
				System.out.println("任务id:" + task.getId());
				System.out.println("任务名称:" + task.getName());
				System.out.println("任务办理人:" + task.getAssignee());
				System.out.println("任务创建时间:" + task.getCreateTime());
				System.out.println("流程实例id:" + task.getProcessInstanceId());
				System.out.println("执行对象id:" + task.getExecutionId());
				System.out.println("###########################################");
			} 
		}
	}
	
	/**  
	* @Name: completeMyPersonalTask（方法的名称）
	* @Description: 完成个人任务：因为存在连线分支，完成个人任务的同时应该指定流程变量，以决定下一步走哪个连线（方法的描述）
	* @Author: 李超（作者）
	* @Version: V1.00 （版本号）
	* @Create Date: 2016-12-14 （创建日期）
	* @Parameters: 无（方法的入参，如果没有，填写为“无”）
	* @Return: 无（返回值，如果没有，填写为“无”）
	*/
	@Test
	public void completeMyPersonalTask() {
		//任务id
		String taskId = "92504" ;
		//完成任务的同时，设置流程变量，来指定完成当前任务后进行的下一个连线，对应sequenceFlow.bpmn中的${message=='不重要'}
		Map<String, Object> variables = new HashMap<String, Object>() ;
		variables.put("message", "不重要") ;
		processEngine.getTaskService().complete(taskId, variables) ; //根据指定的任务id完成任务，同时设置流程变量，以决定下一步走哪个连线
		System.out.println("完成任务，任务id:" + taskId);
	} 
	
}
